Mise à jour le 13/11/2021
Faire un projet de qualité sans framework

Faire un projet de qualité sans framework

1. Contraintes

C'est possible à la condition de respecter strictement plusieurs choses :
* toutes les PSR doivent être appliquées à la lettre ;
* le langage est toujours à la dernière version ;
* les librairies sont toujours à jour (cela ne doit pas empêcher pas d'être prudent).

2. Démarrer un projet

Nous avons vu que la PSR-1 nous imposait si on faisait de la POO d'utiliser les namespaces.
Même en PHP 8.0, il ne semble pas y avoir d'autoloader par défaut qui puisse nous permettre d'utiliser les différents use.

2.1 Créer un autoload via spl_autoload_register

2.1.1 Créer le fichier autoload.php

On peut créer un fichier autoload.php et y écrire ceci :

<?php
spl_autoload_register(function ($className) {
$className = str_replace('\\', DIRECTORY_SEPARATOR, $className);
$filename = __DIR__ . DIRECTORY_SEPARATOR . $className . '.php';

    if (is_readable($filename)) {
        require_once($filename);
    }
});

2.1.2 Importer l'autoload dans l'index.php

Puis importer ce fichier dans un index.php de la façon suivante :

<?php
require_once('autoload.php');


Après quoi il sera possible dans le fichier index.php d'utiliser des use, eux-mêmes utilisant des use et des namespace.

2.1.3 Exemple d'arborescence

App\
    Service\
            MyService.php
index.php
autoload.php

Avec MyService.php :

<?php

namespace App\Service;

class MyService
{
    public static function myMethod(): string
    {
        return 'ok';
    }
}

et index.php :

<?php
require_once('autoload.php');

use App\Service\MyService;

echo MyService::myMethod();

Attention à bien respecter la PSR-4 : le respect de la casse est indispensable.

2.1.4 Défaut d'un autoload personnel

L'autoload doit être mis à jour dès qu'il y a des nouveautés en terme de PSR et de montée de version du langage.
Par exemple, en PHP 7.0 est introduit la possibilité de faire des use multiples, ce que ne prend pas en compte l'autoload du dessus.

2.2 Utiliser l'autoloader de Composer

Quoi de plus simple que d'utiliser l'autoloader certainement le plus populaire et le plus utilisé du moment ?

2.2.1 On commence par créer le composer.json à la racine de son projet

{
  "type": "project",
  "license": "MIT",
  "autoload": {
    "psr-4": {
      "App\\": "App/"
    }
  }
}


Puis on crée un projet via la commande suivante :

composer create-project

Cette commande va générer le dossier vendor et surtout le fichier autoload.php que l'on peut inclure dans son index.php
On peut alors utiliser les uses multiples.

<?php
require ('autoload.php');

use App\Service\{MyClass, MyOther};

MyClass::myMethod();
MyOther::myMethod();

2.2.2 Matcher le namespace App et le dossier src

Si vous souhaitez que toutes les classes définies dans le dossier src de votre projet correspondent au namespace App, il vous faut pour cela modifier la propriété autoload du composer.jon

{
  "type": "project",
  "license": "MIT",
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    }
  }
}

Puis faire une mise à jour de l'autoload via :

composer update

Il est alors possible d'utiliser l'arborescence suivante :

src\
    Service\
            MyService.php
index.php
autoload.php

En gardant le namespace App.

Cela semble assez antinomique que la PS4 autorise ce type de mapping mais c'est une solution plus souple que de contraindre les namespaces aux noms de dossiers.

2.3 Que faire sans un moteur de template ?

Sur un projet qui n'aurait pas la chance d'avoir un moteur de template évolué (twig/smarty pour les plus connus), on peut éventuellement s'en sortir en faisait quelque chose comme la solution que je présente dans la page sur "les différentes façons de construire une page HTML".